使用驱动程序验证程序识别问题

您所在的位置:网站首页 服务器安装windows server 2008蓝屏 使用驱动程序验证程序识别问题

使用驱动程序验证程序识别问题

2024-01-09 14:01| 来源: 网络整理| 查看: 265

使用驱动程序验证程序识别高级用户的 Windows 驱动程序问题 项目 07/17/2023

自 Windows 2000 以来,每个版本的 Windows 中都包含驱动程序验证程序工具。 它用于检测和排查许多已知会导致系统损坏、故障或其他不可预知行为的驱动程序问题。 本文介绍如何使用驱动程序验证程序隔离和排查系统中的驱动程序问题。

适用于:Windows Server 2012 Foundation、Windows Server 2012 Essentials、Windows Server 2012 Standard、Windows Server 2012 Datacenter 原始 KB 编号: 244617

驱动程序验证程序功能

若要使用驱动程序验证程序,请运行Verifier.exe,然后重启计算机。 无需进行任何其他更改即可开始分析系统中的驱动程序。 用户帐户需要管理员权限才能运行Verifier.exe。

驱动程序验证程序可以检查驱动程序行为的许多不同方面。 这些功能分为使用标志启用的选项或设置。 (在驱动程序验证程序文档中通常可互换术语选项、设置和标志。它们表示类似的概念。)

有关每个标志的详细信息,请参阅 驱动程序验证程序选项和规则类。

标准选项

以下选项一起表示系统中所有驱动程序都不应违反的规则。 当你选择在驱动程序验证程序 GUI 中启用标准设置或在使用命令行配置驱动程序验证程序时指定 /standard 开关时,将启用这些选项。

自动检查

无论选择什么选项,这些检查始终都会针对正在验证的驱动程序执行。

自动检查示例:

IRQL 检查 引发 IRQL (表示当前 IRQL 小于目标 IRQL) 。 降低的 IRQL (表示当前 IRQL 大于目标 IRQL) 。 SpinLocks: 双次释放自旋锁。 自旋锁获取/发布是在适当的 IRQL 上进行的。 内存分配: 分页池分配/释放是在正确的 IRQL (APC_LEVEL或更低) 。 非分页池分配/释放是在正确的 IRQL (DISPATCH_LEVEL或更低) 。 未为这些应用程序编程接口指定随机 (未初始化) 值, (API) 。 释放的分配不会指向活动计时器对象。 驱动程序卸载检查: 验证驱动程序在卸载时没有挂起的操作,例如挂起的 DPC 或辅助角色线程。 其他驱动程序行为: 不正确地切换线程堆栈。 尝试在 IRQL >调用 KeWaitXxx = DISPATCH_LEVEL。 取消引用计数为 0 的对象。 特殊池

当此选项处于活动状态时,驱动程序验证程序会从特殊池分配大部分驱动程序的内存请求。 此特殊池监视释放后访问的内存溢出、内存不足和内存。

强制 IRQL 检查

当此选项处于活动状态时,驱动程序验证程序通过使可寻呼代码失效对驱动程序施加极大的内存压力。 如果驱动程序尝试访问错误 IRQL 或持有旋转锁的分页内存,驱动程序验证程序会检测到此行为。

池跟踪

当此选项处于活动状态时,驱动程序验证程序会检查驱动程序在卸载时是否已释放其所有内存分配。 它揭示了内存泄漏。

I/O 验证

当此选项处于活动状态时,驱动程序验证程序会从特殊池中分配驱动程序的 IRP,并监视驱动程序的 I/O 处理。 它检测非法或不一致地使用 I/O 例程。

启用 I/O 验证程序时:

通过 IoAllocateIrp 分配的所有 IRP 均从特殊池分配(如果可用)。 在 IoCallDriver、IoCompleteRequest 和 IoFreeIrp 中进行检查以捕获驱动程序错误消息。 所有 I/O 验证程序故障 bug 都会检查代码DRIVER_VERIFIER_IOMANAGER_VIOLATION (0xC9) 。

注意

在 Windows 7 及更高版本的 Windows 操作系统中,增强型 I/O 验证的所有功能都作为 I/O 验证的一部分包含在内,并且它不再可用,也不需要在驱动程序验证器管理器或命令行中选择增强型 I/O 验证选项。

死锁检测

当此选项处于活动状态时,驱动程序验证程序会监视驱动程序对旋转锁、互斥体和快速互斥体的使用。 它检测驱动程序的代码是否有可能在某个时候导致死锁。

增强的 I/O 验证

当此选项处于活动状态时,驱动程序验证程序会监视多个 I/O 管理器例程的调用,并执行对 PnP IRP、电源 IRP 和 WMI IRP 的压力测试。

注意

在 Windows 7 及更高版本中,增强型 I/O 验证的所有功能都包含在 I/O 验证中。 此选项在驱动程序验证器管理器或命令行中不再可用或需要。

DMA 验证

当此选项处于活动状态时,驱动程序验证程序会监视驱动程序对 DMA 例程的使用。 它检测到 DMA 缓冲区、适配器和地图寄存器的使用不当。

安全检查

当此选项处于活动状态时,驱动程序验证程序会查找可能导致安全漏洞的常见错误,例如按内核模式例程引用用户模式地址。

其他检查

当此选项处于活动状态时,驱动程序验证程序会查找驱动程序崩溃的常见原因,例如释放的内存处理不当。

DDI 符合性检查

当此选项处于活动状态时,驱动程序验证程序将应用一组设备驱动程序接口 (DDI) 规则,检查驱动程序与操作系统的内核接口之间的正确交互。

DDI 符合性检查选项是使用名为 VerifierExt.sys 的内核模式库实现的。 如果发现某个 DDI 合规性检查规则存在冲突,则VerifierExt.sys将是要求进行系统 bug 检查的模块。

其他选项

这些选项专为特定方案测试而设计,或者是将故障或延迟注入特定 DDI 例程以模拟极端压力条件的选项。

驱动程序验证程序要求

唯一的要求是必须安装Windows Server 2012。 可以在 Windows 的零售版本和已选中版本上启用驱动程序验证程序。 如果安装了 Norton 防病毒,请勿启用驱动程序验证程序的死锁检测。

启用驱动程序验证程序

可以使用Verifier.exe启用驱动程序验证程序。 Verifier.exe包含在 Windows 的每个副本中。 它会自动安装到 System32 文件夹中。 Verifier.exe具有命令行和图形用户界面 (GUI) 接口,因此可以指定驱动程序和适当的验证级别。 还可以实时查看驱动程序验证程序统计信息。 有关详细信息,请参阅 驱动程序验证器管理器 (Verifier.exe) 部分。

调试驱动程序验证程序冲突

如果驱动程序验证程序检测到冲突,则标准行为是对系统进行 bug 检查,以提供有关调试问题的最可能信息。 一旦发生 bug 检查,连接到调试器的系统将停止。

所有驱动程序验证程序冲突都会导致 bug 检查,但最常见的 (,尽管它们不一定都) :

0xC1:SPECIAL_POOL_DETECTED_MEMORY_CORRUPTION 0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION 0xC6:DRIVER_CAUGHT_MODIFYING_FREED_POOL 0xC9:DRIVER_VERIFIER_IOMANAGER_VIOLATION 0xD6:DRIVER_PAGE_FAULT_BEYOND_END_OF_ALLOCATION 0xE6:DRIVER_VERIFIER_DMA_VIOLATION

!analyze -v 是启动新的调试会话时要使用的最佳命令。 此命令将返回有用的信息,并尝试查明故障驱动程序。

特定于驱动程序验证程序的调试器扩展:

!verifier 将转储捕获的驱动程序验证程序统计信息。 !verifier -? 将显示所有可用选项。 !deadlock 转储与死锁检测跟踪的锁或对象相关的信息。 !deadlock -? 将显示所有可用选项。 !iovirp [address] 将转储与 I/O 验证程序跟踪的 IRP 相关的信息。 !ruleinfo [RuleID] 将转储与违反的 DDI 符合性检查规则相关的信息 (RuleID 始终是 bug 检查的第一个参数,所有 DDI 符合性检查规则 ID 都采用 0x200nn) 形式。 驱动程序验证程序和图形驱动程序

Windows 内核模式图形驱动程序(如打印机和显示驱动程序 DLL)被限制直接调用池入口点。 池分配是使用图形设备驱动程序接口间接执行的, (DDI) 回调Win32k.sys。 例如,EngAllocMem 是图形驱动程序调用的显式分配池内存的回调。 其他专用回调(如 EngCreatePalette 和 EngCreateBitmap)也会返回池内存。

若要为图形驱动程序提供相同的自动测试,对某些驱动程序验证程序函数的支持已合并到Win32k.sys中。 由于图形驱动程序比其他内核模式驱动程序受到更多的限制,因此它们只需要驱动程序验证程序功能的子集。 具体而言,不需要 IRQL 检查和 I/O 验证。 其他功能(即使用特殊池、池分配的随机失败和池跟踪)在不同的图形 DDI 回调中受到不同程度的支持。

以下图形 DDI 回调函数支持随机故障:

EngAllocMem EngAllocUserMem EngCreateBitmap EngCreateDeviceSurface EngCreateDeviceBitmap EngCreatePalette EngCreateClip EngCreatePath EngCreateWnd EngCreateDriverObj BRUSHOBJ_pvAllocRbrush CLIPOBJ_ppoGetPath

此外,EngAllocMem 还支持使用特殊池和池跟踪。

为图形驱动程序启用驱动程序验证程序与其他驱动程序相同。 有关详细信息,请参阅 “启用驱动程序验证程序” 部分。 忽略不受支持的标志,如 IRQL 检查。 此外,还可以使用 !gdikdx.verifier 内核调试器命令检查图形驱动程序的当前驱动程序验证程序状态和池跟踪。

注意

应仅使用随机分配失败设置进行可靠性测试。 使用此设置可能会导致呈现错误消息,因此不应将此设置与验证测试结合使用,以检查图形驱动程序实现的正确性 (例如,通过将图形驱动程序输出与引用图像) 进行比较。

驱动程序验证器管理器 (Verifier.exe)

驱动程序验证器管理器工具 (Verifier.exe) 是创建和修改驱动程序验证程序设置和从驱动程序验证程序收集统计信息的首选方法。 Verifier.exe位于每个 Windows 安装的 %WinDir%\System32 文件夹中。

驱动程序验证程序管理器是 Windows 中包含的用于配置驱动程序验证程序的 GUI。 在不使用任何其他命令行开关的情况下使用verifier.exe启动驱动程序验证器管理器。 只要包含交换机,就会使用基于命令行的实用工具版本。

有关配置驱动程序验证程序的帮助,请从管理员 CMD 窗口运行 verifier.exe /? 。

驱动程序状态

“驱动程序状态”属性页提供驱动程序验证程序的当前状态的图像。 可以看到验证程序检测到的驱动程序。 状态可以是以下值之一:

加载:驱动程序当前已加载并验证。 卸载:驱动程序当前未加载,但自重新启动计算机以来,该驱动程序至少加载了一次。 从未加载:从未加载过驱动程序。 此状态可以指示驱动程序的映像文件已损坏或指定了系统中缺少的驱动程序名称。

选择列表标头以按驱动程序名称或状态对列表进行排序。 在对话框的右上角区域中,可以查看当前生效的验证类型。 如果不切换到手动刷新模式,将自动更新驱动程序的状态。 可以使用对话框左下角区域中的单选按钮修改刷新速率。 若要强制更新状态,请选择 “立即更新”。

如果启用特殊池标志,并且只有不到 95% 的池分配已转到特殊池,则会在此页上显示警告消息。 这意味着需要选择一组较小的驱动程序进行验证,或将更多物理内存添加到计算机,以获得池分配验证的更好覆盖范围。

全局计数器

此属性页显示驱动程序验证程序维护的某些计数器的当前值。 计数器的零值可以指示未启用关联的驱动程序验证器标志。 例如,其他/容错计数器的值 为 0 表示未启用低资源模拟标志。 可以监视验证程序的活动,因为默认情况下会自动更新计数器的值。 可以使用对话框左下角区域中的控件组更改刷新率、切换到手动刷新或强制刷新。

池跟踪

此属性页显示从驱动程序验证程序收集的更多统计信息。 此页上显示的所有计数器都与验证程序的池跟踪标志相关。 其中大多数是按驱动程序计数器,例如当前分配、当前分配的字节等。 必须从顶部组合框中选择驱动程序名称才能查看该特定驱动程序的计数器。

设置

可以使用此页面创建和修改驱动程序验证程序设置。 设置保存在注册表中,必须重启计算机才能使设置生效。 可以使用列表查看当前安装的驱动程序。 每个驱动程序可以处于以下状态之一:

验证已启用:驱动程序当前已验证。 验证已禁用:当前未验证驱动程序。 验证启用 (重启所需的) :仅在下次重启后验证驱动程序。 验证禁用 (重启所需的) :驱动程序当前已验证,但在下次重启后未验证。

可以从列表中选择一个或多个驱动程序,并使用列表下的两个按钮切换状态。 还可以右键单击驱动程序名称以显示上下文菜单,以便执行状态切换。

在对话框底部,可以指定更多驱动程序 (用要在下一次重启后验证的空间) 分隔。 如果想要安装尚未加载的新驱动程序,通常会使用此编辑控件。

如果列表顶部的单选按钮组设置为 “验证所有驱动程序”,则列表和“验证和不验证”按钮以及编辑控件不可用。 这意味着在下次重启后,系统中的所有驱动程序都会得到验证。

可以使用对话框右上角区域中的复选框设置验证类型。 可以在级别 1 或级别 2 启用 I/O 验证。 级别 2 验证比级别 1 更强。

通过选择“ 应用”保存对设置的任何修改。 此页中还有两个按钮:

首选设置:它选择一些常用设置 (所有已验证的驱动程序) 。 重置所有:它清除所有驱动程序验证程序设置,以便不验证任何驱动程序。

选择 “应用”后,必须重启计算机才能使更改生效。

易失性设置

可以使用此属性页立即更改驱动程序验证器标志。 只能切换某些驱动程序验证器标志的状态。 并且无法更改正在验证的驱动程序的列表。 更改某些复选框的状态后,选择“ 应用 ”以使更改生效。 更改将立即生效。 它们一直持续到你进行其他更改,或直到重新启动计算机。

命令行接口

还可以从命令行 (运行Verifier.exe以获取详细信息,在命令提示符 处键入verifier.exe /?) 。 可以在命令行上使用多个开关,例如:

Verifier.exe /flags 0x209BB /driver MyDriver1.sys MyFilterDriver1.sys

以下列表显示了最常用的命令行标志:

配置选项 (标志)

verifier.exe /flags 值

值 是一个十六进制数字, (需要 0x 前缀) 表示要启用的标志的集体值。 输出中显示了每个标志的 verifier /? 值。

标准标志:

0x00000000:自动检查 0x00000001:特殊池 0x00000002:强制进行 IRQL 检查 0x00000008:池跟踪 0x00000010:I/O 验证 0x00000020:死锁检测 0x00000080:DMA 检查 0x00000100:安全检查 0x00000800:其他检查 0x00020000:DDI 符合性检查

更多标志:

0x00000004:随机化的低资源模拟 0x00000040:仅) Vista (增强的 I/O 验证 0x00000200:强制执行挂起的 I/O 请求 0x00000400:IRP 日志记录 0x00002000:堆栈的固定 MDL 检查 0x00004000:针对 driver0x000008000 的固定 MDL 检查:Power Framework 延迟模糊

例如,仅启用特殊池、I/O 验证和杂项检查:

verifier.exe /flags 0x811

若要启用所有标准设置 (任一示例) :

verifier.exe /standard verifier.exe /flags 0x209BB

配置驱动程序以验证

verifier.exe /driver driver1.sys [driver2.sys driver3.sys ...]

此命令指定要验证的特定驱动程序或驱动程序。 在空格分隔列表中提供其他驱动程序。

verifier.exe /all

此命令验证系统中的所有驱动程序。

使用 Volatile 模式进行配置

verifier.exe /volatile /flags *value /adddriver MyDriver1.sys*

此命令会立即更改验证器标志,并添加用于验证的MyDriver1.sys。

查询当前验证程序统计信息

verifier /query

将当前驱动程序验证程序状态和计数器转储到标准输出。

查询当前验证程序设置

verifier /querysettings

将当前的驱动程序验证程序设置转储到标准输出。

清除验证程序设置

verifier.exe /reset

此命令会擦除所有当前的驱动程序验证程序设置。

面向驱动程序开发人员的其他信息

以下部分介绍了驱动程序开发人员可能感兴趣的驱动程序验证程序设置的更多详细信息。 IT 专业人员通常不需要这些设置。

重要

此部分(或称方法或任务)介绍了修改注册表的步骤。 但是,注册表修改不当可能会出现严重问题。 因此,请务必严格按照这些步骤操作。 为了加强保护,应先备份注册表,再进行修改。 如果出现问题,可以还原注册表。 有关如何备份和还原注册表的详细信息,请参阅如何备份和还原 Windows 中的注册表。

若要通过编辑注册表启用驱动程序验证程序,请执行以下步骤:

启动注册表编辑器 (Regedt32) 。

找到以下注册表项:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDrivers

编辑密 REG_SZ 钥。

REG_SZ将密钥设置为要测试的驱动程序不区分大小写的名称。 可以指定多个驱动程序,但只使用一个驱动程序。 通过这样做,可以确保可用的系统资源不会过早耗尽。 资源过早耗尽不会导致任何系统可靠性问题,但可能导致某些驱动程序检查被绕过。

以下列表显示了键的 REG_SZ 值示例:

Ntfs.sys Win32k.sys ftdisk.sys *.sys

可以在以下注册表项中指定驱动程序验证级别:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDriverLevel

密钥的值是表示已启用的所有标志的集合的 DWORD。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3